/**
 * Copyright 2010 - YangJiandong(chunquedong)
 * 
 * This file is part of ChunMap project
 * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE(Version >=3)
 * 
 * ChunMap是开源软件。你可以自由复制、传播本项目的下载包文件，但必须保持其完整性。
 * 我们不用对使用中的风险及由此造成的损失承担任何责任。
 * 详细情况请见《ChunMap许可协议》。
 * 
 * 想了解更多有关ChunMap的信息，请访问http://code.google.com/p/chunmap/
 * 
 * 下面此段程序作者YangJianDong(chunquedong)
 * 最后修改时间2010.7.17
 */
package chunmap.model.algorithm;

import chunmap.model.coord.Position;
import chunmap.model.elem.Envelope;
import chunmap.model.geom.GeoPoint;
import chunmap.model.geom.Geometry;
import chunmap.model.geom.GeometryCollection;
import chunmap.model.geom.GeometryException;
import chunmap.model.geom.LineString;
import chunmap.model.geom.Ring;
import chunmap.model.geom.Polygon;

public class EnvelopeAlgorithm {
	public static boolean hasIntersect(Envelope env,Geometry geom)
    {
        if (geom instanceof GeoPoint)
        {
        	Position p = ((GeoPoint)geom).getCoordinate();
            return env.contain(p);
        }
        else if (geom instanceof LineString)
        {
            LineString ls = (LineString)geom ;
            return env.toRing().hasIntersection(ls);
        }
        else if (geom instanceof Polygon)
        {
            Polygon pg = (Polygon)geom;
            Ring r = env.toRing();
            if (pg.getShell().containIn(env.getCenter()))
            {
                if (inHoles(r, pg))
                {
                    return false;
                }
                return true;
            }
            else
            {
                if (r.hasIntersection(pg.getShell())) return true;

                return false;
            }
        }
        else if (geom instanceof GeometryCollection)
        {
            GeometryCollection gs = (GeometryCollection)geom;
            for (Geometry g : gs)
            {
                if (hasIntersect(env, g)) return true;
            }
            return false;
        }
        else
        {
            throw new GeometryException();
        }
    }

    private static boolean inHoles(LineString ls, Polygon pg)
    {
        for (Ring r : pg.getHoles())
        {
            if (r.containLineStringIn(ls)) return true;
        }
        return false;
    }
}
